#include "clint.h"
#include "mmio.h"
#include "riscv.h"
// CLINT在QEMU virt平台的物理地址
#define CLINT_BASE 0x2000000
#define CLINT_MTIMECMP(hart) (CLINT_BASE + 0x4000 + 8*(hart))
#define CLINT_MTIME (CLINT_BASE + 0xBFF8)

// 初始化时钟中断（设置首次触发时间）
void clint_init(void) {
    int hart = r_mhartid();
    uint64_t now = mmio_read64(CLINT_MTIME);
    mmio_write64(CLINT_MTIMECMP(hart), now + 1000000);  // 1ms后触发
}

// 更新时钟中断触发时间（用于周期性中断）
void clint_set_next_tick(uint32_t hart) {
    uint64_t now = mmio_read64(CLINT_MTIME);
    mmio_write64(CLINT_MTIMECMP(hart), now + 1000000);  // 下一个1ms
}
